﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorDomicilio
    {

        /// <summary>
        /// Permite obtener el Domicilio segun su identificador
        /// </summary>
        /// <param name="oid">Identificador</param>
        /// <returns>Contacto</returns>
        public static Domicilio Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "DOMICILIOS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Domicilio result = dt.ToGenericList<Domicilio>(DomicilioConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new DomicilioGetException(ex);
            }
        }

        public static void Guardar(Domicilio domicilio, IDomicilios entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "DOMICILIOS_PROC";
                repo.AddParameter("@ACCION", domicilio.Persistencia);
                repo.AddParameter("@ID", domicilio.OID);
                repo.AddParameter("@ENTIDAD", (entidad != null) ? entidad.GetType().Name : null);
                repo.AddParameter("@IDREGISTRO", (entidad != null) ? entidad.OID : 0);
                repo.AddParameter("@IDTIPOCONTACTO", domicilio.TipoContacto.OID);
                repo.AddParameter("@CALLE", domicilio.Calle);
                repo.AddParameter("@INTERSECCION", domicilio.Interseccion);
                repo.AddParameter("@IDALTURA", domicilio.Altura);
                repo.AddParameter("@PISO", domicilio.Piso);
                repo.AddParameter("@DEPARTAMENTO", domicilio.Departamento);
                repo.AddParameter("@CP", domicilio.CodigoPostal);
                repo.AddParameter("@IDCIUDAD", domicilio.Ciudad != null ? domicilio.Ciudad.OID:0);
                repo.AddParameter("@PRINCIPAL", domicilio.Principal);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                domicilio.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                //GestorBitacora.Guardar(domicilio);
            }
            catch (Exception ex)
            {
                throw new DomicilioSaveException(ex);
            }
        }

        /// <summary>
        /// Guarda una lista de domicilios relacionada a una entidad
        /// </summary>
        /// <param name="domicilios">Lista de domicilios</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(List<Domicilio> domicilios, IDomicilios entidad)
        {
            foreach (Domicilio d in domicilios)
            {
                Guardar(d, entidad);
            }


        }

        public static void Guardar(IDomicilios entidad)
        {
            foreach (Domicilio c in entidad.Domicilios)
            {
                Guardar(c, entidad);
            }
        }

        public static void Eliminar(Domicilio domicilio)
        {
            domicilio.Persistencia = EstadoPersistencia.DELETE;
            Guardar(domicilio, null);
        }

        /// <summary>
        /// Permite consultar los domicilios de una entidad
        /// </summary>
        /// <param name="entidad">Entidad consultada</param>
        /// <returns>Todos los domcilio de la entidad</returns>
        public static List<Domicilio> Consultar(IDomicilios entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "DOMICILIOS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@ENTIDAD", entidad.GetType().Name);
                repo.AddParameter("@IDREGISTRO", entidad.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Domicilio> result = dt.ToGenericList<Domicilio>(DomicilioConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new DomicilioGetException(ex);
            }
        }

        public static List<Domicilio> Activos(IDomicilios entidad)
        {
            try
            {
                return entidad.Domicilios.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList();
            }
            catch (Exception ex)
            {
                throw new DomicilioGetException(ex);
            }
        }
                

        #region Converter
        public static Domicilio DomicilioConverter(DataRow row)
        {
            return new Domicilio
            {
                OID = row["domID"].ToInteger(),
                Calle = row["domCALLE"].ToString(),
                Interseccion = row["domINTERSECCION"].ToString(),
                Altura = row["domALTURA"].ToString(),
                Piso = row["domPISO"].ToString(),
                Departamento = row["domDEPARTAMENTO"].ToString(),
                Observaciones = row["domOBSERVACION"].ToString(),
                Principal = row["domPRINCIPAL"].ToBoolean(),
                TipoContacto = GestorTipoContacto.Obtener(row["domIDTIPOCONTACTO"].ToInteger()),
                Ciudad = GestorCiudad.Obtener(row["domIDCIUDAD"].ToInteger()),
                Persistencia = EstadoPersistencia.UPDATE
            };
        }
        #endregion


    }
}
